home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / LINUX / MROUTE.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  6KB  |  224 lines

  1. #ifndef __LINUX_MROUTE_H
  2. #define __LINUX_MROUTE_H
  3.  
  4. #include <linux/sockios.h>
  5. #include <linux/in.h>
  6.  
  7. /*
  8.  *    Based on the MROUTING 3.5 defines primarily to keep
  9.  *    source compatibility with BSD.
  10.  *
  11.  *    See the mrouted code for the original history.
  12.  *
  13.  *      Protocol Independent Multicast (PIM) data structures included
  14.  *      Carlos Picoto (cap@di.fc.ul.pt)
  15.  *
  16.  */
  17.  
  18. #define MRT_BASE    200
  19. #define MRT_INIT    (MRT_BASE)    /* Activate the kernel mroute code     */
  20. #define MRT_DONE    (MRT_BASE+1)    /* Shutdown the kernel mroute        */
  21. #define MRT_ADD_VIF    (MRT_BASE+2)    /* Add a virtual interface        */
  22. #define MRT_DEL_VIF    (MRT_BASE+3)    /* Delete a virtual interface        */
  23. #define MRT_ADD_MFC    (MRT_BASE+4)    /* Add a multicast forwarding entry    */
  24. #define MRT_DEL_MFC    (MRT_BASE+5)    /* Delete a multicast forwarding entry    */
  25. #define MRT_VERSION    (MRT_BASE+6)    /* Get the kernel multicast version    */
  26. #define MRT_ASSERT    (MRT_BASE+7)    /* Activate PIM assert mode        */
  27. #define MRT_PIM        (MRT_BASE+8)    /* enable PIM code    */
  28.  
  29. #define SIOCGETVIFCNT    SIOCPROTOPRIVATE    /* IP protocol privates */
  30. #define SIOCGETSGCNT    (SIOCPROTOPRIVATE+1)
  31. #define SIOCGETRPF    (SIOCPROTOPRIVATE+2)
  32.  
  33. #define MAXVIFS        32    
  34. typedef unsigned long vifbitmap_t;    /* User mode code depends on this lot */
  35. typedef unsigned short vifi_t;
  36. #define ALL_VIFS    ((vifi_t)(-1))
  37.  
  38. /*
  39.  *    Same idea as select
  40.  */
  41.  
  42. #define VIFM_SET(n,m)    ((m)|=(1<<(n)))
  43. #define VIFM_CLR(n,m)    ((m)&=~(1<<(n)))
  44. #define VIFM_ISSET(n,m)    ((m)&(1<<(n)))
  45. #define VIFM_CLRALL(m)    ((m)=0)
  46. #define VIFM_COPY(mfrom,mto)    ((mto)=(mfrom))
  47. #define VIFM_SAME(m1,m2)    ((m1)==(m2))
  48.  
  49. /*
  50.  *    Passed by mrouted for an MRT_ADD_VIF - again we use the
  51.  *    mrouted 3.6 structures for compatibility
  52.  */
  53.  
  54. struct vifctl {
  55.     vifi_t    vifc_vifi;        /* Index of VIF */
  56.     unsigned char vifc_flags;    /* VIFF_ flags */
  57.     unsigned char vifc_threshold;    /* ttl limit */
  58.     unsigned int vifc_rate_limit;    /* Rate limiter values (NI) */
  59.     struct in_addr vifc_lcl_addr;    /* Our address */
  60.     struct in_addr vifc_rmt_addr;    /* IPIP tunnel addr */
  61. };
  62.  
  63. #define VIFF_TUNNEL    0x1    /* IPIP tunnel */
  64. #define VIFF_SRCRT    0x2    /* NI */
  65. #define VIFF_REGISTER    0x4    /* register vif    */
  66.  
  67. /*
  68.  *    Cache manipulation structures for mrouted and PIMd
  69.  */
  70.  
  71. struct mfcctl
  72. {
  73.     struct in_addr mfcc_origin;        /* Origin of mcast    */
  74.     struct in_addr mfcc_mcastgrp;        /* Group in question    */
  75.     vifi_t    mfcc_parent;            /* Where it arrived    */
  76.     unsigned char mfcc_ttls[MAXVIFS];    /* Where it is going    */
  77.     unsigned int mfcc_pkt_cnt;        /* pkt count for src-grp */
  78.     unsigned int mfcc_byte_cnt;
  79.     unsigned int mfcc_wrong_if;
  80.     int         mfcc_expire;
  81. };
  82.  
  83. /* 
  84.  *    Group count retrieval for mrouted
  85.  */
  86.  
  87. struct sioc_sg_req
  88. {
  89.     struct in_addr src;
  90.     struct in_addr grp;
  91.     unsigned long pktcnt;
  92.     unsigned long bytecnt;
  93.     unsigned long wrong_if;
  94. };
  95.  
  96. /*
  97.  *    To get vif packet counts
  98.  */
  99.  
  100. struct sioc_vif_req
  101. {
  102.     vifi_t    vifi;        /* Which iface */
  103.     unsigned long icount;    /* In packets */
  104.     unsigned long ocount;    /* Out packets */
  105.     unsigned long ibytes;    /* In bytes */
  106.     unsigned long obytes;    /* Out bytes */
  107. };
  108.  
  109. /*
  110.  *    This is the format the mroute daemon expects to see IGMP control
  111.  *    data. Magically happens to be like an IP packet as per the original
  112.  */
  113.  
  114. struct igmpmsg
  115. {
  116.     __u32 unused1,unused2;
  117.     unsigned char im_msgtype;        /* What is this */
  118.     unsigned char im_mbz;            /* Must be zero */
  119.     unsigned char im_vif;            /* Interface (this ought to be a vifi_t!) */
  120.     unsigned char unused3;
  121.     struct in_addr im_src,im_dst;
  122. };
  123.  
  124. /*
  125.  *    That's all usermode folks
  126.  */
  127.  
  128. #ifdef __KERNEL__
  129. extern struct sock *mroute_socket;
  130. extern int ip_mroute_setsockopt(struct sock *, int, char *, int);
  131. extern int ip_mroute_getsockopt(struct sock *, int, char *, int *);
  132. extern int ipmr_ioctl(struct sock *sk, int cmd, unsigned long arg);
  133. extern void mroute_close(struct sock *sk);
  134. extern void ipmr_forward(struct sk_buff *skb, int is_frag);
  135. extern int ip_mr_find_tunnel(__u32, __u32);
  136. extern void ip_mr_init(void);
  137.  
  138.  
  139. struct vif_device
  140. {
  141.     struct device     *dev;            /* Device we are using */
  142.     unsigned long    bytes_in,bytes_out;
  143.     unsigned long    pkt_in,pkt_out;        /* Statistics             */
  144.     unsigned long    rate_limit;        /* Traffic shaping (NI)     */
  145.     unsigned char    threshold;        /* TTL threshold         */
  146.     unsigned short    flags;            /* Control flags         */
  147.     __u32        local,remote;        /* Addresses(remote for tunnels)*/
  148.     int        link;            /* Physical interface index    */
  149. };
  150.  
  151. struct mfc_cache 
  152. {
  153.     struct mfc_cache *next;            /* Next entry on cache line     */
  154.     __u32 mfc_mcastgrp;            /* Group the entry belongs to     */
  155.     __u32 mfc_origin;            /* Source of packet         */
  156.     vifi_t mfc_parent;            /* Source interface        */
  157.     struct timer_list mfc_timer;        /* Expiry timer            */
  158.     int mfc_flags;                /* Flags on line        */
  159.     struct sk_buff_head mfc_unresolved;    /* Unresolved buffers        */
  160.     int mfc_queuelen;            /* Unresolved buffer counter    */
  161.     unsigned long mfc_last_assert;
  162.     int mfc_minvif;
  163.     int mfc_maxvif;
  164.     unsigned long mfc_bytes;
  165.     unsigned long mfc_pkt;
  166.     unsigned long mfc_wrong_if;
  167.     unsigned char mfc_ttls[MAXVIFS];    /* TTL thresholds        */
  168. };
  169.  
  170. #define MFC_QUEUED        1
  171. #define MFC_RESOLVED        2
  172. #define MFC_NOTIFY        4
  173.  
  174.  
  175. #define MFC_LINES        64
  176.  
  177. #ifdef __BIG_ENDIAN
  178. #define MFC_HASH(a,b)    ((((a)>>24)^((b)>>26))&(MFC_LINES-1))
  179. #else
  180. #define MFC_HASH(a,b)    (((a)^((b)>>2))&(MFC_LINES-1))
  181. #endif        
  182.  
  183. #endif
  184.  
  185.  
  186. #define MFC_ASSERT_THRESH (3*HZ)        /* Maximal freq. of asserts */
  187.  
  188. /*
  189.  *    Pseudo messages used by mrouted
  190.  */
  191.  
  192. #define IGMPMSG_NOCACHE        1        /* Kern cache fill request to mrouted */
  193. #define IGMPMSG_WRONGVIF    2        /* For PIM assert processing (unused) */
  194. #define IGMPMSG_WHOLEPKT    3        /* For PIM Register processing */
  195.  
  196. #ifdef __KERNEL__
  197.  
  198. #define PIM_V1_VERSION        __constant_htonl(0x10000000)
  199. #define PIM_V1_REGISTER        1
  200.  
  201. #define PIM_VERSION        2
  202. #define PIM_REGISTER        1
  203.  
  204. #define PIM_NULL_REGISTER    __constant_htonl(0x40000000)
  205.  
  206. /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */
  207.  
  208. struct pimreghdr
  209. {
  210.     __u8    type;
  211.     __u8    reserved;
  212.     __u16    csum;
  213.     __u32    flags;
  214. };
  215.  
  216. extern int pim_rcv(struct sk_buff * , unsigned short);
  217. extern int pim_rcv_v1(struct sk_buff * , unsigned short len);
  218.  
  219. struct rtmsg;
  220. extern int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait);
  221. #endif
  222.  
  223. #endif
  224.